K-means聚类算法Matlab代码

原理:

(1) 从 n个样本随机选择作为初始NumCluster个聚类中心;

(2) 计算每个样本与聚类中心的距离,根据最小距离划分到相应类中;

(3) 重新计算每个聚类的中心,即所有类内样本求平均值;

(4) 循环(2)到(3)直到每个聚类不再发生变化为止。


K-means算法的matlab代码,输入样本和聚类个数,返回所有类内距离和之和和收敛迭代次数,画图部分,用了基本的7种颜色,故8类以上无法画图会有提示,并且4维以上无法画图。

主要函数解析

%% -----------------------K-means聚类函数---------------------------------

% 入参:

%    NumCluster 聚类个数

%    x          样本

% 出参:

%    f        所有类内距离和之和

%    g        收敛迭代次数

%% -----------------------------------------------------------------------

function [f,g]=K_means(NumCluster,x)

g=1;

[N,L]=size(x);

%% 从样本中随机获取值初始化Numcluster个类的质点

r=randperm(N);

for t=1:NumCluster

    Center(t,1:L)=x(r(t),1:L)

end

ert=10;

while (ert~=0)

    M_Center=Center;


    %% 步骤1:将所有样本划分到对应类

    for j=1:N

        %% 计算样本到各质点距离

        for t=1:NumCluster

            Dist(t,1)=Dis(x(j,1:L),Center(t,1:L));

        end


        %% 将距离最近的质点划分到对应类

        Min_dis=min(Dist);

        [m,l]=find(Min_dis==Dist);

        for t=1:NumCluster

            if m==t

                x(j,L+1)=t;

            end

        end

    end


    %% 步骤2:质点迭代,将所有类的质点求取平均值替换原有质点

    for t=1:NumCluster

        [m,l]=find(x(:,L+1)==t);

        Center(t,:)=mean(x(m,1:L),1);

    end


    %% 计量迭代次数

    g=g+1;


    %% 计算相邻打迭代的质点变化量,若无变化,则迭代结束

    ert=abs(Center(:,1:L)-M_Center(:,1:L));

end

%% 计算所有类内间距和

sm=zeros(NumCluster,1);

for t=1:NumCluster

    [m,l]=find(x(:,3)==t);

    Len=size(m,1);

    for i=1:Len

        sm(t,1)=sm(t,1)+ sqrt( sum( ( x(i,1:L)-Center(t,1:L) ).^2,2) );

    end

end

f=sum(sm,1);

%% 画图

fprintf('画图\n');

color1={'rs','bs','ms','ks','gs','cs','ys'};

color2={'r*','b*','m*','k*','g*','c*','y*'};

%% 最多提供7个类别,3个维度的画图

if NumCluster<8 && L<4

    %% 2维情况

    if L==2

        plot(x(:,1),x(:,2),'o');

        for t=1:NumCluster

            hold on

            plot(Center(t,1),Center(t,2),color1{t})

            [m,l]=find(x(:,3)==t);

            hold on

            plot(x(m,1),x(m,2),color2{t});

        end

    end

    %% 3维情况

    if L==3

        plot3(x(:,1),x(:,2),x(:,3),'o');

        for t=1:NumCluster

            hold on

            plot3(Center(t,1),Center(t,2),Center(t,3),color1{t})

            [m,l]=find(x(:,4)==t);

            hold on

            plot3(x(m,1),x(m,2),x(m,3),color2{t});

        end

    end

else

    fprintf('error\n');

end

end



下载地址:http://download.csdn.net/detail/aircherfjt/5425275

另一个k-means domo地址:http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/AppletKM.html

样本2维

聚成2类


聚成4类


聚成7类


样本3维

聚成3类



  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值